package com.pool;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
 * 四大拒绝策略：
 * 1.new ThreadPoolExecutor.AbortPolicy() => 银行满了，还有人进来，不处理这个人，抛出异常
 * 2.new ThreadPoolExecutor.CallerRunsPolicy() => 哪里来的哪里去（main线程执行）
 * 3.new ThreadPoolExecutor.DiscardPolicy() => 队列满了，丢掉任务，不会抛出异常
 * 4.new ThreadPoolExecutor.DiscardOldestPolicy() => 队列满了，尝试去和最早的竞争，也不会抛出异常
 * */
public class Demo02 {
    public static void main(String[] args) {
        // 自定义线程池   ==> 工作中使用
        // 7大参数
        // 最大线程到底该如何定义？（调优）
        // 1.CPU密集型：电脑几核，就设置为几，可以保证CPU效率最高  （本机12）
        // 2.IO密集型：>判断你程序中十分耗IO的线程
        System.out.println(Runtime.getRuntime().availableProcessors()); // 获取CPU的核数：12

        List list = new ArrayList();
//        list.forEach();
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,                          // 核心线程池大小
                Runtime.getRuntime().availableProcessors(),// 最大核心线程池大小
                3,                         // 超时了没有人调用就会释放
                TimeUnit.SECONDS,                        // 超时单位
                new LinkedBlockingDeque<>(3),   // 阻塞队列--侯客厅
                Executors.defaultThreadFactory(),        // 线程工厂：创建线程的，一般不用动
                new ThreadPoolExecutor.DiscardOldestPolicy());   // 队列满了，尝试去和最早的竞争，也不会抛出异常


        try {
            // 最大承载：队列 + 最大核心线程池大小
            // java.util.concurrent.RejectedExecutionException
            for (int i = 1; i <= 9; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "=>在办业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}
